﻿using System.Collections.Generic;
using System.Linq;
using TYBase;

namespace DSPara
{
    public class SortPara
    {
        public string Section { get; private set; }

        public string TypeName { get; set; }

        public SortPara(string section)
        {
            this.Section = section;
        }

        public List<Entity_SortPara_Level> ListSort { get; set; } = new List<Entity_SortPara_Level>();

        public void Init(Entity_SortPara entity_sort)
        {
            ListSort.Clear();
            if (entity_sort != null && entity_sort.ListSortPara != null)
            {
                TypeName = entity_sort.TypeName;
                var listSort = entity_sort.ListSortPara.OrderBy(x => x.AtLevel).ToList(); ;
                for (int i = 0; i < listSort.Count; i++)
                {
                    if (!ListSort.Exists(x => x.AtLevel == listSort[i].AtLevel))
                    {
                        ListSort.Add(listSort[i]);
                    }
                }
            }
        }

        public int GetLevel(List<double> listData, List<int> skipLevels)
        {
            for (int i = 0; i < ListSort.Count; i++)
            {
                if (skipLevels.Contains(ListSort[i].AtLevel))
                {
                    continue;
                }

                bool atThisLevel = true;
                for (int j = 0; j < listData.Count; j++)
                {
                    if (atThisLevel == false)
                        continue;
                    if (j < ListSort[i].ListSortItem.Count && j < ListSort[i].ListSortItem.Count)
                    {
                        if (ListSort[i].ListSortItem[j].IsUse && listData[j] >= ListSort[i].ListSortItem[j].Min && listData[j] < ListSort[i].ListSortItem[j].Max)
                        {
                        }
                        else
                        {
                            atThisLevel = false;
                            continue;
                        }
                    }
                    else
                    {
                        atThisLevel = false;
                        continue;
                    }
                }
                if (atThisLevel)
                    return ListSort[i].AtLevel;
            }
            return -1;
        }

        public bool IsLevel(int level, List<double> listData)
        {
            for (int i = 0; i < ListSort.Count; i++)
            {
                if (ListSort[i].AtLevel != level)
                    continue;
                var levelPara = ListSort[i];

                for (int j = 0; j < listData.Count; j++)
                {
                    double val = listData[j];
                    if (j < levelPara.ListSortItem.Count && j < levelPara.ListSortItem.Count)
                    {
                        if (ListSort[i].ListSortItem[j].IsUse && val >= levelPara.ListSortItem[j].Min && val < levelPara.ListSortItem[j].Max)
                        {
                        }
                        else
                        {
                            return false;
                        }
                    }
                    else
                    {
                        return false;
                    }
                }
                return true;
            }
            return false;
        }

        public int GetLevel(List<double> listData)
        {
            List<int> listLevel = new List<int>();
            for (int i = 0; i < ListSort.Count; i++)
            {
                bool isatLevel = true;
                bool isFire = false;
                for (int j = 0; j < listData.Count; j++)
                {
                    if (isatLevel == false)
                    {
                        break;
                    }
                    if (j < ListSort[i].ListSortItem.Count && j < ListSort[i].ListSortItem.Count)
                    {
                        if (ListSort[i].ListSortItem[j].IsUse == false)
                        {
                            continue;
                        }

                        if (ListSort[i].ListSortItem[j].Min == 0 && ListSort[i].ListSortItem[j].Max == 0)
                        {
                            continue;
                        }
                        if (listData[j] >= ListSort[i].ListSortItem[j].Max || listData[j] < ListSort[i].ListSortItem[j].Min)
                        {
                            isatLevel = false;
                            break;
                        }
                        else
                        {
                            isFire = true;
                            continue;
                        }
                    }
                    else
                    { 
                        isatLevel = false;
                        continue;
                    }
                }
                if (isatLevel && isFire)
                    return ListSort[i].AtLevel;
            }
            return -1;
        }

        public bool IsNG(double data, int j)
        {
            List<int> listLevel = new List<int>();
            for (int i = 0; i < ListSort.Count; i++)
            {
                if (j < ListSort[i].ListSortItem.Count && j < ListSort[i].ListSortItem.Count)
                {
                    if (ListSort[i].ListSortItem[j].IsUse == false)
                    {
                        return false;
                    }

                    if (ListSort[i].ListSortItem[j].Min == 0 && ListSort[i].ListSortItem[j].Max == 0)
                    {
                        return false;
                    }
                    if (data >= ListSort[i].ListSortItem[j].Max || data < ListSort[i].ListSortItem[j].Min)
                    {
                        return false;
                    }
                    
                }
            }
            return true;
        }


        public List<int> GetLevels(List<double> listData)
        {
            List<int> listLevel = new List<int>();
            for (int i = 0; i < ListSort.Count; i++)
            {
                bool isatLevel = true;
                for (int j = 0; j < listData.Count; j++)
                {
                    if (isatLevel == false)
                    {
                        break;
                    }

                    if (j < ListSort[i].ListSortItem.Count && j < ListSort[i].ListSortItem.Count)
                    {
                        if (ListSort[i].ListSortItem[j].IsUse == false)
                        {
                            continue;
                        }

                        if (ListSort[i].ListSortItem[j].Min == 0 && ListSort[i].ListSortItem[j].Max == 0)
                        {
                            continue;
                        }
                        if (listData[j] >= ListSort[i].ListSortItem[j].Max || listData[j] < ListSort[i].ListSortItem[j].Min)
                        {
                            //Log.I($"NG:{listData[j]} max:{ListSort[i].ListSortItem[j].Max} min:{ListSort[i].ListSortItem[j].Min}");
                            isatLevel = false;
                            break;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    else
                    {
                        Log.I($"NG:{listData[j]} ");
                        isatLevel = false;
                        continue;
                    }
                }
                if (isatLevel)
                    listLevel.Add(ListSort[i].AtLevel);
            }
            return listLevel;
        }



    }
}